package com.atguigu.java;

import org.testng.annotations.Test;

import java.io.*;

/**
 * 处理流之一：缓冲流的使用
 *
 * 1.缓冲流：
 *  非文本文件：
 *  BufferedInputStream
 *  BufferedOutputStream
 *  文本文件：
 *  BufferedReader
 *  BufferedWriter
 *
 * 2.作用：提供流的读取、写入速度
 *   提高读写速度的原因：内部提供了一个缓冲区
 *
 * 3. 处理流：就是“套接”在已有的流的基础上。
 *
 */
public class BufferedTest {

    /*
    实现非文本文件的复制

     */
    @Test
    public void BufferedStreamTest(){
        BufferedInputStream bis = null;
        BufferedOutputStream bos = null;
        try {
            //1.造文件
            File scrFile = new File("下午 趴在桌子的女孩4k动漫壁纸3840x2160_彼岸图网.jpg");
            File destFile = new File("下午 趴在桌子的女孩4k动漫壁纸3840x2160_彼岸图网3.jpg");

            //2.造流
            //2.1 造节点流
            FileInputStream fis = new FileInputStream(scrFile);
            FileOutputStream fos = new FileOutputStream(destFile);
            //2.2 造缓冲流
            bis = new BufferedInputStream(fis);
            bos = new BufferedOutputStream(fos);

            //3.读、写数据
            byte[] buffer = new byte[10];
            int len;
            while ((len = bis.read(buffer)) != -1){
                bos.write(buffer,0,len);
            }
        } catch (IOException e) {
            throw new RuntimeException(e);
        } finally {
            //4.资源关闭
            //要求：先关闭外层的流，在关闭内层的流
            try {
                if(bis != null)
                bis.close();
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
            try {
                if(bos != null)
                bos.close();
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
            //说明：在关闭外层流的同时，内层流也会自动的进行关闭。关于内层六我们可以省略
//            try {
//                if(fis != null)
//                fis.close();
//            } catch (IOException e) {
//                throw new RuntimeException(e);
//            }
//            try {
//                if(fos != null)
//                fos.close();
//            } catch (IOException e) {
//                throw new RuntimeException(e);
//            }
        }
    }

    //实现文件复制的方法
    public void copyFileWihBuffered(String scrPast,String destPath) {
        BufferedInputStream bis = null;
        BufferedOutputStream bos = null;
        try {
            //1.造文件
            File scrFile = new File(scrPast);
            File destFile = new File(destPath);

            //2.造流
            //2.1 造节点流
            FileInputStream fis = new FileInputStream(scrFile);
            FileOutputStream fos = new FileOutputStream(destFile);
            //2.2 造缓冲流
            bis = new BufferedInputStream(fis);
            bos = new BufferedOutputStream(fos);

            //3.读、写数据
            byte[] buffer = new byte[1024];
            int len;
            while ((len = bis.read(buffer)) != -1) {
                bos.write(buffer, 0, len);

                //bos.flush();//刷新缓冲区
            }
        } catch (IOException e) {
            throw new RuntimeException(e);
        } finally {
            //4.资源关闭
            //要求：先关闭外层的流，在关闭内层的流
            try {
                if (bis != null)
                    bis.close();
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
            try {
                if (bos != null)
                    bos.close();
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
        }
    }
    @Test
    public void testcopyFileWihBuffered(){
        long  start = System.currentTimeMillis();

        String srcPath = "雷电模拟器 2021-06-05 17-10-24.mp4";
        String destPath = "雷电模拟器 2021-06-05 17-10-24.2.mp4";
        copyFileWihBuffered(srcPath,destPath);

        long  end = System.currentTimeMillis();

        System.out.println("复制花费的时间为：" + (end - start));//16
    }

    /*
    使用BufferedReader和BufferedWriter实现文本文件的复制
     */
    @Test
    public void testBufferedReaderBufferedWriter(){
        BufferedReader br = null;
        BufferedWriter bw = null;
        try {
            //创建文件和相应的流
            br = new BufferedReader(new FileReader(new File("dbcp.txt")));
            bw = new BufferedWriter(new FileWriter(new File("dbcp1.txt")));

            //读写操作
            //方式一：使用char[]型数组
//            char[] buffer = new char[1024];
//            int len;
//            while ((len = br.read(buffer)) != -1){
//                bw.write(buffer,0,len);
//            }
            //方式二；使用String
            String data;
            while ((data = br.readLine()) != null){
                //要换行的方法：
                //方法一：
//                bw.write(data + "\n");//data中不包括换行符
                //方法二：
                bw.write(data);//data中不包括换行符
                bw.newLine();//提供换行操作
            }

        } catch (IOException e) {
            throw new RuntimeException(e);
        } finally {
            //关闭资源
            try {
                if(br != null)
                br.close();
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
            try {
                if(bw != null)
                bw.close();
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
        }
    }
}
